Constrained codes are becoming increasingly popular in storage systems, such as hard disk drive storage systems. One example of a constrained code is a maximum transition run (MTR) code. MTR codes limit the number of consecutive transitions in a bit sequence. For example, the bit sequence (0, 1, 0, 1) has 3 transitions (i.e., a low-to-high transition, a high-to-low transition, and then a low-to-high transition) and a MTR limit of 2 would cause that bit sequence to be modified since it exceeds the maximum number of consecutive transitions. Another example of a constrained code is a run length limited (RLL) code where the number of consecutive bits with the same value is limited to some maximum. For example, the bit sequence (0, 0, 0, 0) has a run length of 4 (i.e., there are 4 bits in a row with the same value) and a run length limit of 3 would cause that bit sequence to be modified since its run length exceeds the maximum.
When constrained codes are used in storage systems, it is known that certain bit sequences cannot validly occur in the signal read back from storage since the constrained code would have prevented those sequences from being written to storage in the first place. Although some techniques may exist for incorporating this knowledge into a Viterbi detector, issues may arise when a design is actually implemented as a real world product. For example, some techniques may encounter issues when implemented using fixed point and/or modulo arithmetic. New techniques which do not have these issues when implemented in a real world product would be desirable.